package org.shuma.goods.contant;

import lombok.Getter;

import java.util.concurrent.TimeUnit;

/**
 * @author : liuming
 * @date : 2024/6/18 下午5:51
 */
public enum DelayLevel {
    /**
     * 延迟级别枚举，映射RocketMQ支持的延迟时间。
     * 注意：这里的值需与RocketMQ实际支持的延迟级别相对应。
     */
    NO_DELAY(0, "不延迟"),
    LEVEL_1S(1, 1, TimeUnit.SECONDS),
    LEVEL_5S(2, 5, TimeUnit.SECONDS),
    LEVEL_10S(3, 10, TimeUnit.SECONDS),
    LEVEL_30S(4, 30, TimeUnit.SECONDS),
    LEVEL_1M(5, 1, TimeUnit.MINUTES),
    LEVEL_2M(6, 2, TimeUnit.MINUTES),
    LEVEL_3M(7, 3, TimeUnit.MINUTES),
    LEVEL_4M(8, 4, TimeUnit.MINUTES),
    LEVEL_5M(9, 5, TimeUnit.MINUTES),
    LEVEL_6M(10, 6, TimeUnit.MINUTES),
    LEVEL_7M(11, 7, TimeUnit.MINUTES),
    LEVEL_8M(12, 8, TimeUnit.MINUTES),
    LEVEL_9M(13, 9, TimeUnit.MINUTES),
    LEVEL_10M(14, 10, TimeUnit.MINUTES),
    LEVEL_20M(15, 20, TimeUnit.MINUTES),
    LEVEL_30M(16, 30, TimeUnit.MINUTES),
    LEVEL_1H(17, 1, TimeUnit.HOURS),
    LEVEL_2H(18, 2, TimeUnit.HOURS);
    @Getter
    private final int level;
    private final long delayTime;

    DelayLevel(int level, long delayTime, TimeUnit unit) {
        this.level = level;
        this.delayTime = unit.toMillis(delayTime);
    }

    DelayLevel(int level, String description) {
        this(level, 0L, TimeUnit.MILLISECONDS); // 不延迟的情况
        // 可以在这里添加描述，但实际上在枚举中添加描述不如直接在方法中处理来得直观
    }

    public long getDelayTime(TimeUnit unit) {
        return unit.convert(delayTime, TimeUnit.MILLISECONDS);
    }

    /**
     * 根据延迟时间（单位：毫秒）找到最接近的延迟级别。
     * 这个方法是简化的示例，实际应用中可能需要更复杂的逻辑来精确匹配或接近用户所需的延迟时间。
     *
     * @param delayTimeInMillis 延迟时间，单位毫秒
     * @return 最接近的延迟级别，如果没有合适的级别则返回NO_DELAY
     */
    public static DelayLevel getLevel(Long delayTimeInMillis) {
        for (DelayLevel level : values()) {
            if (level != NO_DELAY && level.delayTime >= delayTimeInMillis) {
                return level;
            }
        }
        return NO_DELAY;
    }
}
